package com.opengate.base.utils;

import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;

/**
 * @author 曳戈泰尔
 * @version 1.0
 * @description 雪花算法生成Id工具类
 * @date 2023/4/26 5:46 PM
 */
public class SnowFlakeUtil {

    /** 机器id */
    private long machineId;
    /** 数据标识id */
    private long dataCenterId;

    public SnowFlakeUtil(long machineId, long dataCenterId) {
        this.machineId = machineId;
        this.dataCenterId = dataCenterId;
    }

    /** 成员类，SnowFlakeUtil的实例对象的保存域 */
    private static class IdGenHolder {
        private static final SnowFlakeUtil INSTANCE = new SnowFlakeUtil();
    }

    /** 外部调用获取SnowFlakeUtil的实例对象，确保不可变 */
    public static SnowFlakeUtil get() {
        return IdGenHolder.INSTANCE;
    }

    /** 初始化构造，无参构造有参函数，默认节点都是0 */
    public SnowFlakeUtil() {
        this(0L, 0L);
    }

    /** 初始化构造，有参函数，传入节点 */
    private final Snowflake snowflake = IdUtil.createSnowflake(machineId, dataCenterId);

    /** 同步锁，保证线程安全 */
    public synchronized long id() {
        return snowflake.nextId();
    }

    /**
     * 获取id
     *
     * @return id
     */
    public static Long getId() {
        return SnowFlakeUtil.get().id();
    }
}
